package metier;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Etudiant implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7148359565298958208L;

	private int idEtudiant = -1;
	private Departement departement = null;
	private String nom;
	private String prenom;
	private String login;
	private String mdp;
	private Set<Candidature> listeCandidatures = new HashSet<Candidature>();

	private void testerExceptionDepartement(Departement departement)
			throws Exception {
		if (departement == null)
			throw new Exception("Le département ne doit pas être null");
	}
	
	private void testerExceptionNom(String nom)
			throws Exception {
		if ((nom==null) || nom.equals(""))
			throw new Exception("Nom ["+nom+"] incorrect");
	}

	private void testerExceptionPrenom(String prenom)
			throws Exception {
		if ((prenom==null) || prenom.equals(""))
			throw new Exception("Prenom ["+prenom+"] incorrect");
	}
	
	private void testerExceptionLogin(String login)
			throws Exception {
		if ((login==null) || login.equals(""))
			throw new Exception("login ["+login+"] incorrect");
	}
	
	private void testerExceptionMdp(String mdp)
			throws Exception {
		if ((mdp==null) || mdp.equals(""))
			throw new Exception("mdp ["+mdp+"] incorrect");
	}

	public Etudiant(int idEtudiant, Departement departement, String nom, String prenom, String login, String mdp) throws Exception {
		
		super();
		
		testerExceptionDepartement(departement);
		testerExceptionNom(nom);
		testerExceptionPrenom(prenom);
		testerExceptionLogin(login);
		testerExceptionMdp(mdp);
		
		this.idEtudiant = idEtudiant;		
		this.departement = departement;		
		this.nom = nom;
		this.prenom = prenom;
		this.login = login;
		this.mdp = mdp;
		
	}
	
	public Etudiant(Departement departement, String nom, String prenom, String login, String mdp) throws Exception {
		
		super();
		
		testerExceptionDepartement(departement);
		testerExceptionNom(nom);
		testerExceptionPrenom(prenom);
		testerExceptionLogin(login);
		testerExceptionMdp(mdp);
			
		this.departement = departement;		
		this.nom = nom;
		this.prenom = prenom;
		this.login = login;
		this.mdp = mdp;
	}

	/**
	 * Bien qu'illogique avec le mod�le UML, ce constructeur est obligatoire pour respecter la convention
	 * des JavaBean utilisŽe par certains frameworks (Struts, Hibernate, ...)
	 */
	public Etudiant()
	{		
		this.nom = "Neant";
		this.prenom = "Neant";
	}

	public int getIdEtudiant() {
		return idEtudiant;
	}

	public void setIdEtudiant(int idEtudiant) {
		this.idEtudiant = idEtudiant;
	}

	public Departement getDepartement() {
		return departement;
	}

	public void setDepartement(Departement departement) {
		this.departement = departement;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public Set<Candidature> getListeCandidatures() {
		return listeCandidatures;
	}

	public void setListeCandidatures(Set<Candidature> listeCandidatures) {
		this.listeCandidatures = listeCandidatures;
	}
	
	public String getLogin() {
		return login;
	}

	public String getMdp() {
		return mdp;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public void setMdp(String mdp) {
		this.mdp = mdp;
	}

	public void addCandidature(Candidature candidature) {
		this.listeCandidatures.add(candidature);
	}
	
	public int nbCandidatures () {
		return this.listeCandidatures.size();
	}

	@Override
	public String toString() {
		
		String s = "Etudiant ["+this.idEtudiant+";"+this.nom+";"+this.prenom+";"+this.departement.getLibelle().toString()+";"+this.login+";"+this.mdp+"]";
		for (Candidature candidature : this.getListeCandidatures())
			s += candidature.getIdentifiantCandidature().toString();
		
		return s;
	}

	@Override
	public int hashCode() {
		
		int result = 1;
		
		try
		{
			final int prime = 31;
			result = prime * result
				+ ((departement == null) ? 0 : departement.getLibelle().hashCode());
			result = prime * result + idEtudiant;
			result = prime
				* result
				+ ((listeCandidatures == null) ? 0 : listeCandidatures
						.hashCode());
			result = prime * result + ((nom == null) ? 0 : nom.hashCode());
			result = prime * result + ((prenom == null) ? 0 : prenom.hashCode());
			result = prime * result + ((login == null) ? 0 : login.hashCode());
			result = prime * result + ((mdp == null) ? 0 : mdp.hashCode());
		}
		
		catch(Exception mException)
		{}
		
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		
		if (this == obj)
			return true;
		
		if (obj == null)
			return false;
		
		if (getClass() != obj.getClass())
			return false;
		
		Etudiant other = (Etudiant) obj;
		
		if (departement == null) 
		{
			if (other.departement != null)
				return false;
		} 
		else if (!departement.equals(other.departement))
			return false;
		
		if (idEtudiant != other.idEtudiant)
			return false;
		
		// modification de la fonction equals car appel récursif croisé! 
		
		if (nom == null) 
		{
			if (other.nom != null)
				return false;
		} 
		else if (!nom.equals(other.nom))
			return false;
		
		if (prenom.equals("")) 
		{
			if (other.prenom.equals(""))
				return false;
		} 
		else if (!prenom.equals(other.prenom))
			return false;
		
		if (login.equals("")) 
		{
			if (other.prenom.equals(""))
				return false;
		} 
		else if (!login.equals(other.login))
			return false;
		
		if (mdp.equals("")) 
		{
			if (other.mdp.equals(""))
				return false;
		} 
		else if (!mdp.equals(other.mdp))
			return false;
		
		return true;
	}
}
